<?php
/**
 * Конструктор меню
 */
class Menu
{
	/**
	 * Тип меню
	 * @var string 
	 */
	private $_type;
	
	/**
	 * Пункты меню
	 * @var Array 
	 */
	private $_items;
	
	public function __construct($type = 'main')
	{
		$this->_type = $type;
	}
	
	/**
	 * Построение дерева меню
	 */
	public function buildItems()
	{
		$itemsArray = array();
		$menuConf = Yii::getPathOfAlias('application.config.menu.' . $this->_type) . '.php';
		if(file_exists($menuConf))
		{
			$itemsArray = require($menuConf);
		}
		foreach(Yii::app()->modules as $name => $module)
		{
			$menuConf = Yii::getPathOfAlias('application.modules.' . $name . '.config.menu.' . $this->_type) . '.php';
			if(file_exists($menuConf))
			{
				$itemsArray = $this->mergeMenu($itemsArray, require($menuConf));
			}
		}
		$this->_items = $this->buildItemsFromArray($itemsArray);
	}
	
	/**
	 * Возвращает дерево меню
	 * @return type
	 */
	public function getItems()
	{
		return $this->_items;
	}
	
	/**
	 * Возвращает текущий выбранный пункт (верхний уровень)
	 */
	public function getCurrentItem()
	{
		foreach($this->_items as $item)
		{
			if($item->id == Yii::app()->controller->module->getId())
			{
				return $item;
			}
		}
		return false;
	}


	/**
	 * Добавляет информацию из конфига к главному меню
	 * @param array $menuArray
	 * @param array $menu
	 * @return array
	 */
	protected function mergeMenu($menuArray, $menu)
	{
		foreach($menu as $key => $value)
		{
			if(isset($menuArray[$key]))
			{
				if(isset($value['items']))
				{
					$menuArray[$key]['items'] = $this->mergeMenu($menuArray[$key]['items'], $value['items']);
				}
				$menuArray[$key] = array_merge($value, $menuArray[$key]);
			}
			else
			{
				$menuArray = $menuArray + $menu;
			}
		}
		
		return $menuArray;
	}
	
	/**
	 * Строит дерево объектов меню из массива
	 * @param Array $itemsArray
	 * @return \MenuItem
	 */
	private function buildItemsFromArray($itemsArray)
	{
		$currentUrl = Yii::app()->createUrl(
			Yii::app()->controller->route, 
			Yii::app()->controller->actionParams
		);
		$menuItems = array();
		
		foreach($itemsArray as $key => $item)
		{
			if(isset($item['name']) && !empty($item['name']))
			{
				$menuItem = new MenuItem($key);
				
				if(isset($item['name']) && !empty($item['name']))
				{
					$menuItem->setName($item['name']);
				}
				
				if(isset($item['route']) && !empty($item['route']))
				{
					$menuItem->route = $item['route'];
				}
				
				if(isset($item['params']) && is_array($item['params']))
				{
					$menuItem->params = $item['params'];
				}
				
				if(in_array($currentUrl, array($menuItem->getLink(), $menuItem->getLink() . '/index')))
				{
					$menuItem->isActive = true;
				}
				
				if(isset($item['items']) && is_array($item['items']))
				{
					$menuItem->items = $this->buildItemsFromArray($item['items']);
				}
				$menuItems[] = $menuItem;
			}
		}
		return $menuItems;
	}
}